# ============================================================
# * Copyright © hk. 2022-2025. All rights reserved.
# * File name: CMakeLists.txt
# * Author   : 苏木
# * Date     : 2025-05-22
# * Version  : 
# * Description: cmake version 3.16.3
# ============================================================
## https://cmake.com.cn/cmake/help/latest/guide/tutorial/index.html
## https://cmake.org/cmake/help/latest/

# 指定 CMake 的最低版本要求
# --------------------------------------------------
cmake_minimum_required(VERSION 3.10)


# 设置项目名称和使用的编程语言
# --------------------------------------------------
project(SPROJECT C)
set(app_target "app_demo.out")

# 启用/禁用在生成期间输出编译命令。会生成compile_commands.json文件,包含编译命令，可以被clangd使用实现跳转和补全
# --------------------------------------------------
# 注意,这个选项放在PROJECT之前的话可能导致第一次构建不生效
# SET(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE BOOL "Enable compile commands export" FORCE) # 强制设置变量并更新缓存
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)


# 设置C编译器
# --------------------------------------------------
# set(CMAKE_C_COMPILER "/home/sumu/2software/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc")
set(CMAKE_C_COMPILER "gcc")
message(STATUS "[USER:TOP]CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}") # c编译器，一般默认是gcc


# 设置C编译选项,要放在 add_executable 之前
# --------------------------------------------------
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
add_compile_options(-g -Wall) # 不会去修改 CMAKE_C_FLAGS，一般还是建议用这个


# 指定可执行程序和源文件
# --------------------------------------------------
include_directories(func_version)           # 添加头文件目录
add_subdirectory(func_version)              # 添加子目录（会自动执行子目录的CMakeLists.txt）

set(src_list main.c)                        # 设置main函数源文件
add_executable(${app_target} ${src_list})

target_link_libraries(${app_target} func_version_static) # 链接静态库，这里使用静态库目标名称，而不是输出名称
# target_link_libraries(${app_target} func_version_shared) # 链接动态库，这里使用动态库目标名称，而不是输出名称

# 获取目标的属性,要先指定目标才能获取
# --------------------------------------------------
get_target_property(app_compile_options app_demo.out COMPILE_OPTIONS) # 获取编译选项属性
message(STATUS "[USER:TOP]Target Compile Options: ${app_compile_options}")
message(STATUS "[USER:TOP]CMAKE_C_FLAGS         : ${CMAKE_C_FLAGS}")      # c编译选项

# 普通文件的安装： cmake -DCMAKE_INSTALL_PREFIX=/usr
# --------------------------------------------------
# install(FILES files... DESTINATION <dir>
#         [PERMISSIONS permissions...]
#         [CONFIGURATIONS [Debug|Release|...]]
#         [COMPONENT <component>]
#         [RENAME <name>] [OPTIONAL]
# )
# 这个命令用于安装一般文件，并可以指定访问权限，文件名是此指令所在路径下的相对路径。如果默认不定义权限 PERMISSIONS, 安装后的权限为：
# OWNER_WRITE, OWNER_READ, GROUP_READ,和 WORLD_READ, 即 644 权限。
install(FILES COPYRIGHT README.md DESTINATION share/doc/cmake/03_install_file)

# 非目标文件的可执行程序安装(比如脚本之类) cmake -DCMAKE_INSTALL_PREFIX=/usr
# --------------------------------------------------
# install(PROGRAMS files... DESTINATION <dir>
# 		[PERMISSIONS permissions...]
# 		[CONFIGURATIONS [Debug|Release|...]]
# 		[COMPONENT <component>]
#  		[RENAME <name>] [OPTIONAL]
# )
# 上面的 FILES 指令使用方法一样，唯一的不同是安装后权限为：
# OWNER_EXECUTE, GROUP_EXECUTE, 和 WORLD_EXECUTE, 即 755 权限。
install(PROGRAMS rundemo.sh DESTINATION bin)

# 目录的安装 cmake -DCMAKE_INSTALL_PREFIX=/usr
# --------------------------------------------------
# install(DIRECTORY dirs... DESTINATION <dir>
#  		[FILE_PERMISSIONS permissions...]
#  		[DIRECTORY_PERMISSIONS permissions...]
#  		[USE_SOURCE_PERMISSIONS]
#  		[CONFIGURATIONS [Debug|Release|...]]
#  		[COMPONENT <component>]
#  		[[PATTERN <pattern> | REGEX <regex>]
#  		[EXCLUDE] [PERMISSIONS permissions...]] [...]
# )
# DIRECTORY   后面连接的是所在 Source 目录的相对路径，但务必注意：abc 和 abc/有很大的区别。
# 		      如果目录名不以 / 结尾，那么这个目录将被安装为目标路径下的 abc，
# 			  如果目录名以 / 结尾，代表将这个目录中的内容安装到目标路径，但不包括这个目录本身。
# PATTERN     用于使用正则表达式进行过滤
# PERMISSIONS 用于指定 PATTERN 过滤后的文件权限。
install(DIRECTORY doc/ DESTINATION share/doc/cmake/03_install_file)

# 最终安装目录的结构如下：
# .
# ├── bin
# │   └── rundemo.sh
# └── share
#     └── doc
#         └── cmake
#             └── 03_install_file
#                 ├── COPYRIGHT
#                 ├── README.md
#                 └── usage.md
